//uvalive 5034
const int  maxn =600005;
int n,m,s;
/*************************划分树***********************/
const int LOG=20;//表示划分树层数log(n)层
int tr[LOG][maxn],lessmid[LOG][maxn],sorted[maxn];
//lessmid[i]表示i-l+1之间有多少个小于tr[mid]

void build(int d,int l,int r)
{
	int u,i,j,mid=(l+r)/2,same=0;
	if(l==r)	return ;
	int lp=l,rp=mid+1;
	for(i=l; i<=r; i++)
		if(tr[d][i]<sorted[mid]) 
			same++;
	same=mid-l+1-same;
	for(i=l; i<=r; i++)
	{
		u=tr[d][i];
		if(u<sorted[mid])	
			tr[d+1][lp++]=u;
		else if(u==sorted[mid] && same)
		{
			tr[d+1][lp++]=u;
			same--;
		}
		else
			tr[d+1][rp++]=u;
		lessmid[d][i]=lessmid[d][l-1]+lp-l;
	}
	build(d+1,l,mid);
	build(d+1,mid+1,r);
}
//[l,r]就是像线段树一样，这棵树的本来区间段，[x,y]是要查询的区间
int getvalue(int d,int l,int r,int x,int y,int k)//查询[x,y]区间第k大的数
{
	if(l==r)
		return tr[d][l];
	int mid=(l+r)/2, now=lessmid[d][y]-lessmid[d][x-1];
	int pre=lessmid[d][x-1]-lessmid[d][l-1];
	if(now>=k)
		return getvalue(d+1,l,mid,l+pre,l+pre+now-1,k);
	else
	{
		k-=now; 
		pre=x-l-pre;
		return getvalue(d+1,mid+1,r,mid+pre+1,mid+pre-now+y-x+1,k);
	}
}

int getrank(int d,int l,int r,int x,int y,int a)//查询[x,y]区间中a是排第几大的
{
	if(x>=y)	
		return 1+(x==y && tr[d][x]<a);
	int mid=(l+r)/2, now=lessmid[d][y]-lessmid[d][x-1];
	int pre=lessmid[d][x-1]-lessmid[d][l-1];
	if(a<=sorted[mid])
		return getrank(d+1,l,mid,l+pre,l+pre+now-1,a);
	else
	{
		pre=x-l-pre;
		return now+getrank(d+1,mid+1,r,mid+1+pre,mid+pre-now+y-x+1,a);
	}
}
/*************************划分树***********************/
struct node
{
	int a,b,c,d;
}a[maxn];
int cnt=0;
char ch[102];
int main()
{
	//freopen("in","r",stdin);
    int i,j,k,t,cas=0;
	while(scanf("%d",&n)!=EOF)
	{
		printf("Case %d:\n",++cas);
		cnt=0;
		for(i=0; i<n; i++)
		{
			int x,y,z;
			scanf("%s",ch);
			if(strcmp(ch,"Insert")==0)
			{
				scanf("%d",&x);
				a[i].a=x;
				a[i].d=4;
				++cnt;
		/*************************划分树***********************/
				sorted[cnt]=tr[0][cnt]=x;
		/*************************划分树***********************/
			}
			else if(strcmp(ch,"Query_1")==0)
			{
				scanf("%d%d%d",&x,&y,&z);
				a[i].a=x;
				a[i].b=y;
				a[i].c=z;
				a[i].d=1;
			}
			else if(strcmp(ch,"Query_2")==0)
			{
				scanf("%d",&x);
				a[i].a=x;
				a[i].d=2;	
			}
			else 
			{
				scanf("%d",&x);
				a[i].a=x;
				a[i].d=3;
			} 
		}	
		/*************************划分树***********************/
		sort(sorted+1,sorted+1+cnt);
		build(0,1,cnt);
		/*************************划分树***********************/
		long long ans1,ans2,ans3;
		ans1=ans2=ans3=0ll;
		int now=0,tp;
		for(i=0; i<n; i++)
		if(a[i].d!=4)
		{
			tp=0;
			if(a[i].d==1)
			{
				tp+=getvalue(0,1,cnt,a[i].a,a[i].b,a[i].c);
				ans1+=(ll)tp;
			}
			else if(a[i].d==2)
			{
				ans2+=(ll)getrank(0,1,cnt,1,now,a[i].a);
			}
			else
			{
				ans3+=(ll)getvalue(0,1,cnt,1,now,a[i].a);
			}
		}
		else now++;
		printf("%lld\n%lld\n%lld\n",ans1,ans2,ans3);
		//printf("%I64d\n%I64d\n%I64d\n",ans1,ans2,ans3);
	}
}
